/**
 * author: zhou
 * date: 2017.10.18
 * description: 配置日志记录信息,文件输出位置
 * 
 */

// 引入模块
const   log4js = require('log4js'),
        fs     = require('fs'),
        path   = require('path');

// 日志输出路径配置
const   baseLogPath     = path.resolve(__dirname, '../logs'), // 日志根目录
        requestLogPath  = `${baseLogPath}/request/request`,   // 请求日志输出路径
        responseLogPath = `${baseLogPath}/response/response`, // 响应日志输出路径
        errorLogPath    = `${baseLogPath}/error/error`;       // 错误日志输出路径

// 日志配置        
let logSetting = {
    'appenders': {
        'logger': {
            'type': 'console',
            'level': 'ALL'
        },
        'reqLogger': {
            'type': 'dateFile',           // 输出类型
            'filename': requestLogPath,   // 输出位置
            'alwaysIncludePattern': true, // 包含文件后缀
            'pattern': '-yyyy-MM-dd.log', // 文件后缀
            'path': '/request',           // 日志目录
            'level': 'ALL'
        },
        'resLogger': {
            'type': 'dateFile',            // 输出类型
            'filename': responseLogPath,   // 输出位置
            'alwaysIncludePattern': true,  // 包含文件后缀
            'pattern': '-yyyy-MM-dd.log',  // 文件后缀
            'path': '/response',           // 日志目录
            'level': 'ALL'
        },
        'errorLogger': {
            'type': 'dateFile',            // 输出类型
            'filename': errorLogPath,      // 输出位置
            'alwaysIncludePattern': true,  // 包含文件后缀
            'pattern': '-yyyy-MM-dd.log',  // 文件后缀
            'path': '/error',              // 日志目录
            'level': 'ERROR'
        }
    },
    'categories': {
        'default': {
            'appenders': [
                'logger',
                // 'reqLogger',
                // 'resLogger',
                // 'errorLogger'
            ],
            'level': 'ALL'
        }
    },
    'baseLogPath': baseLogPath
};

// 加载配置文件
log4js.configure(logSetting);

// 创建log实例
const logger = {
    logger: log4js.getLogger('logger'),
    reqLogger: log4js.getLogger('reqLogger'),
    resLogger: log4js.getLogger('resLogger'),
    errorLogger: log4js.getLogger('errorLogger')
}

// 格式化方法
const format = {
    req(ctx, reqTime) {
        const body = ctx.request.body;
        return JSON.stringify({
            type: 'REQUEST',
            ip: ctx.ip,
            method: ctx.method,
            url: ctx.url,
            timestap: new Date(),
            data: body.data
        });
    },
    res(ctx, resTime) {
        return JSON.stringify({
            timestap: new Date(),
            res: ctx.body,
            timeUsed: `${resTime} ms`
        });
    },
    error(err, errorTime) {
        return {
            timestap: new Date(),
            timeUsed: `${errorTime} ms`,
            error: err
        }
    }
};

// 确定目录是否存在,不存在则创建目录
const confirmPath = (pathStr) => {
    if (!fs.existsSync(pathStr)) {
        fs.mkdirSync(pathStr);
    }
};

const log = {
    logRequest(ctx, reqTime) {
        if (ctx) {
            const reqLog = format.req(ctx, reqTime);
            logger.logger.info({ request: reqLog });
            logger.reqLogger.info(reqLog);
        }
    },
    logResponse(ctx, resTime) {
        if (ctx) {
            const resLog = format.res(ctx, resTime);
            logger.logger.info({ response: resLog });
            logger.resLogger.info(resLog);
        }
    },
    logError(error, time) {
        if (error) {
            const errorLog = format.error(error, time);
            logger.logger.info({ error: errorLog });
            logger.errorLogger.info(errorLog);
        }
    },
    initLogPath() {
        if (baseLogPath) {
            confirmPath(baseLogPath);
            for (let i = 0, len = logSetting.appenders.length; i < len; i++) {
                if (logSetting.appenders[0].path) {
                    confirmPath(`${baseLogPath}${logSetting.appenders[0].path}`);
                }
            }
        }
    }
};

module.exports = log;
